#!/usr/bin/env python3
"""
身份证双面处理器 - 命令行入口

专门用于身份证照片正反面处理和组合排版
支持单对处理和批量处理模式
"""

import sys
import argparse
import os
from src.id_card_processor import IDCardProcessor


def main():
    """
    主函数 - 解析命令行参数并执行身份证双面处理
    
    使用场景:
        python main.py --front front.jpg --back back.jpg output.jpg
        python main.py --batch input_folder output_folder
    """
    parser = argparse.ArgumentParser(
        description="身份证双面处理器 - 自动抠图、校正、组合排版",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  身份证双面处理:
    python main.py --front front.jpg --back back.jpg output.jpg
    
  批量处理:
    python main.py --batch input_folder output_folder
    
  自定义选项:
    python main.py --front front.jpg --back back.jpg output.jpg --quality 90 --no-shadow
    
  PDF导出:
    python main.py --front front.jpg --back back.jpg output.jpg --pdf
    
处理说明:
  - 自动去除背景并添加白色背景
  - 智能校正图片倾斜
  - 按标准格式排版（人像面在上，国徽面在下）
  - 生成A4复印件效果
        """
    )
    
    # 基础参数
    parser.add_argument('output', help='输出文件路径', nargs='?')
    
    # 身份证图片参数
    parser.add_argument('--front', '-f', metavar='FRONT_IMAGE', required=True,
                       help='身份证正面（人像面）图片路径')
    
    parser.add_argument('--back', '-b', metavar='BACK_IMAGE', required=True,
                       help='身份证反面（国徽面）图片路径')
    
    # 处理选项
    parser.add_argument('--quality', '-q', type=int, default=95, 
                       choices=range(60, 101), metavar='60-100',
                       help='输出图像质量 60-100 (默认: 95)')
    
    parser.add_argument('--no-correct', action='store_true',
                       help='禁用自动倾斜校正')
    
    parser.add_argument('--no-enhance', action='store_true',
                       help='禁用对比度增强')
    
    parser.add_argument('--no-shadow', action='store_true',
                       help='禁用阴影效果')
    
    parser.add_argument('--no-scan', action='store_true',
                       help='禁用扫描效果')
    
    parser.add_argument('--pdf', action='store_true',
                       help='同时导出PDF格式')
    
    # 批量处理选项
    parser.add_argument('--batch', action='store_true',
                       help='批量处理模式（front和back参数将作为输入和输出文件夹）')
    
    # 信息选项
    parser.add_argument('--info', '-i', action='store_true',
                       help='显示图像信息')
    
    args = parser.parse_args()
    
    # 参数验证
    if args.batch:
        # 批量处理模式
        if not os.path.exists(args.front):
            print(f"错误: 输入文件夹不存在 - {args.front}")
            return 1
        if not args.back:
            print("错误: 批量模式需要指定输出文件夹")
            return 1
        input_dir = args.front
        output_dir = args.back
    else:
        # 单对处理模式
        if not os.path.exists(args.front):
            print(f"错误: 正面图片不存在 - {args.front}")
            return 1
        if not os.path.exists(args.back):
            print(f"错误: 反面图片不存在 - {args.back}")
            return 1
        if not args.output:
            print("错误: 需要指定输出文件路径")
            return 1
    
    # 创建处理器
    processor = IDCardProcessor()
    
    # 处理配置
    config = {
        'output_quality': args.quality,
        'auto_correct': not args.no_correct,
        'enhance_contrast': not args.no_enhance,
        'add_shadow': not args.no_shadow,
        'scan_artifacts': not args.no_scan
    }
    
    try:
        if args.info:
            # 显示图像信息
            if args.batch:
                print("批量模式信息显示暂不支持")
                return 1
            
            info = processor.get_processing_info(args.front, args.back)
            print("=== 身份证图片信息 ===")
            print(f"正面图片: {args.front}")
            print(f"  尺寸: {info['front_size']}")
            print(f"  格式: {info['front_format']}")
            print(f"反面图片: {args.back}")
            print(f"  尺寸: {info['back_size']}")
            print(f"  格式: {info['back_format']}")
            print(f"预计输出尺寸: {info['estimated_output_size']}")
            return 0
        
        elif args.batch:
            # 批量处理模式
            print(f"开始批量处理...")
            print(f"输入文件夹: {input_dir}")
            print(f"输出文件夹: {output_dir}")
            print(f"处理配置: {config}")
            print("-" * 50)
            
            # 创建输出文件夹
            os.makedirs(output_dir, exist_ok=True)
            
            # 扫描输入文件夹
            processed_count = 0
            supported_formats = ('.jpg', '.jpeg', '.png', '.bmp')
            
            # 简单的文件匹配逻辑：按前缀匹配正反面
            files = [f for f in os.listdir(input_dir) if f.lower().endswith(supported_formats)]
            
            # 基本的正反面匹配（可以改进）
            for filename in files:
                if '_front' in filename.lower() or '_正面' in filename or '_人像' in filename:
                    # 寻找对应的反面
                    base_name = filename.replace('_front', '').replace('_正面', '').replace('_人像', '')
                    for back_file in files:
                        if (('_back' in back_file.lower() or '_反面' in back_file or '_国徽' in back_file) 
                            and base_name.replace(os.path.splitext(filename)[1], '') in back_file):
                            
                            front_path = os.path.join(input_dir, filename)
                            back_path = os.path.join(input_dir, back_file)
                            
                            # 生成输出文件名
                            output_name = f"{os.path.splitext(base_name)[0]}_身份证双面.jpg"
                            output_path = os.path.join(output_dir, output_name)
                            
                            print(f"\n处理第 {processed_count + 1} 对:")
                            print(f"  正面: {filename}")
                            print(f"  反面: {back_file}")
                            print(f"  输出: {output_name}")
                            
                            success = processor.process_front_back(front_path, back_path, output_path, config)
                            
                            if success:
                                processed_count += 1
                                print(f"  ✓ 处理成功")
                                
                                # PDF导出
                                if args.pdf:
                                    pdf_path = output_path.replace('.jpg', '.pdf')
                                    try:
                                        from src.pdf_exporter import PDFExporter
                                        exporter = PDFExporter()
                                        exporter.export_single_image(output_path, pdf_path)
                                        print(f"  ✓ PDF已导出: {os.path.basename(pdf_path)}")
                                    except Exception as e:
                                        print(f"  ✗ PDF导出失败: {e}")
                            else:
                                print(f"  ✗ 处理失败")
                            break
            
            print(f"\n批量处理完成! 成功处理 {processed_count} 对身份证")
            
        else:
            # 单对处理模式
            print(f"开始身份证双面处理...")
            print(f"正面图片: {args.front}")
            print(f"反面图片: {args.back}")
            print(f"输出文件: {args.output}")
            print(f"处理配置: {config}")
            print("-" * 50)
            
            success = processor.process_front_back(args.front, args.back, args.output, config)
            
            if success:
                print(f"\n✓ 身份证双面处理完成! 结果保存在: {args.output}")
                
                # PDF导出
                if args.pdf:
                    pdf_path = args.output.rsplit('.', 1)[0] + '.pdf'
                    print(f"正在导出PDF: {pdf_path}")
                    try:
                        from src.pdf_exporter import PDFExporter
                        exporter = PDFExporter()
                        exporter.export_single_image(args.output, pdf_path)
                        print(f"✓ PDF导出完成: {pdf_path}")
                    except Exception as e:
                        print(f"✗ PDF导出失败: {e}")
            else:
                print("✗ 身份证双面处理失败")
                return 1
        
        return 0
        
    except KeyboardInterrupt:
        print("\n用户中断操作")
        return 1
    except Exception as e:
        print(f"程序执行出错: {e}")
        return 1


if __name__ == "__main__":
    sys.exit(main()) 